package org.nobject.common.js;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.nobject.common.exception.ConvertException;
import org.nobject.common.lang.BooleanUtils;
import org.nobject.common.lang.ClassUtils;
import org.nobject.common.lang.MapUtils;
import org.nobject.common.lang.NumberUtils;
import org.nobject.common.lang.ObjectUtils;
import org.nobject.common.lang.StringUtils;

/**
 * JSON键值对象
 * 
 * 以键值对的形式存储数据
 * 提供常用类型数据的操作方法
 * 	put(key,o) 存值
 *  getXXX(key) 获取值
 *  toXXX() 转换
 * 
 * @author bianrongjun
 * @version 1.0
 */
public class JSONObject {
	
	/** 键值对 */
	private Map map;
	
	/**
	 * 构造函数 
	 * @param str 字符串
	 */
	public JSONObject(String str) throws ConvertException{
		this(JSONUtils.toMap(str));
	}
	
	/**
	 * 构造函数 
	 * @param map
	 */
	public JSONObject(Map map){
		this.map=map;
	}
	
	/**
	 * 构造函数 
	 * @param kvs
	 */
	public JSONObject(Object[] [] kvs){
		this.map=MapUtils.toMap(kvs);
	}
	
	/**
	 * 构造函数 
	 */
	public JSONObject(){
		this.map=new LinkedHashMap();
	}
	
	/******************************************************************************************************************
	 * 
	 *  Get 区域
	 * 
	 *******************************************************************************************************************/
	
	/** 获取String键值 */
	public String 	getString		(String key)	{Object o=map.get(key);return o==null?null:StringUtils.toString0(o);}
	/** 获取int键值 */
	public int 		getInt			(String key)	{try {return NumberUtils.toInt(map.get(key));} 			catch (ConvertException e) {throw new RuntimeException(e);}}
	/** 获取double键值 */
	public double 	getDouble		(String key)	{try {return NumberUtils.toDouble(map.get(key));} 		catch (ConvertException e) {throw new RuntimeException(e);}}
	/** 获取long键值 */
	public long 	getLong			(String key)	{try {return NumberUtils.toLong(map.get(key));} 		catch (ConvertException e) {throw new RuntimeException(e);}}
	/** 获取boolean键值 */
	public boolean 	getBoolean		(String key)	{try {return BooleanUtils.toBoolean0(map.get(key));} 	catch (ConvertException e) {throw new RuntimeException(e);}}
	/** 获取List值 */
	public List 	getList			(String key)	{return (List)map.get(key);}
	/** 获取Map值 */
	public Map 		getMap			(String key)	{return (Map)map.get(key);}
	/** 获取JSONArray */
	public JSONArray getJSONArray(String key){
		Object o=map.get(key);
		if(o instanceof List) return new JSONArray((List)o);
		return (JSONArray)o;
	}
	/**  获取JSONObject */
	public JSONObject getJSONObject(String key){
		Object o=map.get(key);
		if(o instanceof Map) return new JSONObject((Map)o);
		return (JSONObject)o;
	}
	
	/** 获取Object键值 */
	public Object getObject(String key)		{return map.get(key);}
	
	/******************************************************************************************************************
	 * 
	 *  To 区域
	 * 
	 *******************************************************************************************************************/
	
	/** 转换为String */
	public String toString()			{return JSONUtils.toString(map);}
	/** 转换为Map */
	public Map toMap()					{return this.map;}
	/** 转换为指定类型  */
	public Object toOject(Class clazz) throws ConvertException{return ObjectUtils.toObject(map, clazz);}
	
	/******************************************************************************************************************
	 * 
	 *  To 区域
	 * 
	 *******************************************************************************************************************/
	
	/** 压入对象 */
	public void put(String key,List o)			{this.map.put(key,o);}
	/** 压入对象 */
	public void put(String key,Map o)			{this.map.put(key,o);}
	/** 压入对象 */
	public void put(String key,JSONObject o)	{this.map.put(key,o);}
	/** 压入对象 */
	public void put(String key,JSONArray o)		{this.map.put(key,o);}
	/** 压入对象 */
	public void put(String key,String o)		{this.map.put(key,o);}
	/** 压入对象 */
	public void put(String key,Number o)		{this.map.put(key,o);}
	/** 压入对象 */
	public void put(String key,boolean o)		{this.map.put(key,o);}
	/** 压入对象 */
	public void _put(String key,Object o)		{this.map.put(key,o);}
	
	/** 删除对象 */
	public void remove(String key){this.map.remove(key);}
	/** 删除对象 */
	public void removeObject(Object obj){this.map.remove(obj);}
	
	/** 键值数量 */
	public int size(){return this.map.size();}
	/** 拥有键值 */
	public boolean containsKey(String key){return this.map.containsKey(key);}
	
	/** 
	 * 返回键值集合
	 */
	public Set keySet(){return this.map.keySet();};
	
	/** 
	 * 任意对象转化为JSONObject
	 */
	public static JSONObject toJSONObject(Object obj) throws ConvertException{
		Class clazz=obj.getClass();
		if(ClassUtils.isString(clazz)) return new JSONObject((String)obj);
		else if(ClassUtils.isMap(clazz)) return new JSONObject((Map)obj);
		else return new JSONObject(MapUtils.toMap0(obj));
	}
}
